package Cliente;

import java.awt.EventQueue;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;

public class Cliente {
    
    private static int port = 25000;
    private static String host = "localhost";
    private PrintWriter out;
    private BufferedReader in;
    private static JanelaChat janela;
    private static String nick;
    private static Socket server;
    
    /**
     * Lê um nick do teclado e tenta autenticar no servidor. Caso o nick seja inválido,
     * uma nova tentativa será oferecida.
    */
    private static String getNick(BufferedReader in, 
                                  PrintWriter out, String message) throws IOException {
        
    	String user;
		do {
			user = janela.getNick(message);
		} while (user != null && user.equals(""));
                
        out.println(user);
        String serverResponse = in.readLine();        
        System.out.println(serverResponse);
       
       if (serverResponse.contains("Seja bem-vindo")){
           String onlineUsers = 
        	   serverResponse.substring(serverResponse.indexOf("[")+1, serverResponse.lastIndexOf("]")-1);
    	   return user + "/" + onlineUsers;
       }
       
        return getNick(in, out, serverResponse);
    }

    public static void main (String[] args) throws IOException {        

        try {
            server = new Socket(host, port);
        } catch (UnknownHostException e) {
            System.err.println(e);
            System.exit(1);
        }

        /* cria um canal para enviar dados para o servidor */
        final PrintWriter out = new PrintWriter(server.getOutputStream(), true);
        /* e um canal para receber dados do servidor */
        final BufferedReader in = new BufferedReader(new InputStreamReader(
                    server.getInputStream()));

        janela = new JanelaChat("Chat");
        String onlineUsers = null;
        
        try {
            String[] temp = getNick(in, out, Messages.INPUT_NAME.toString()).split("/"); 
            nick = temp[0];
            onlineUsers = temp[1];
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
        janela.setTitle(nick);
        janela.mostraJanela();
        janela.setMyUser(nick);
        janela.setList(onlineUsers);

        
        /* cria uma thread para ler mensagens assincronamente do servidor */
        ConexaoServidor sc;
        try {
            sc = new ConexaoServidor(server, janela);
            Thread t = new Thread(sc);
            t.start();
	} catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
	}
        
        String msg = null;
        while (true) {
        	if (janela.getNewMsg()){
            	msg = janela.getMessageFromUser();
        		out.println(msg);
        		janela.setNewMsg(false);
        	}
        	if (janela.getClosingCommand()){
        		out.println(nick + " saiu da sala.");
        		server.close();
        		System.exit(0);
        	}
		}
        	
    }
}


class ConexaoServidor implements Runnable {
    
    private BufferedReader in = null;
    private JanelaChat janela = null;
    public ConexaoServidor (Socket server, JanelaChat janela) throws IOException {
        /* cria um canal para receber dados do servidor */
        in = new BufferedReader(new InputStreamReader(
                    server.getInputStream()));
        this.janela = janela;
    }

    public void run() {
        String msg;
        try {            
            /* lê mensagens do servidor e as mostra na tela */
            while ((msg = in.readLine()) != null) {
                if(msg.contains("entrou na sala") || msg.contains("saiu da sala")){
                	String[] temp = msg.split(" ");
                	if(msg.contains("entrou na sala"))
                		janela.addToList(temp[0]);
                	else
                		janela.removeFromList(temp[0]);
                }
            	janela.setMensagensChat(msg);
                System.out.println(msg);
            }
        } catch (IOException e) {
            System.err.println(e);
        }
    }
}